package estacion.persistencia;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

import estacion.dominio.Tramo;
import estacion.dominio.Persona;
import estacion.dominio.excepciones.NoHayConexionesException;


public class FPTramo {
	public static void insertTramo(Tramo vec) throws Exception {		
		String SQL="Insert into tramo(codigo_tramo, codigo_linea, parada_origen, parada_destino, duracion_recorrido) values("+vec.getCodigo_tramo()+", "+vec.getCodigo_linea()+", '"+vec.getParada_origen()+"', '"+vec.getParada_destino()+"', "+vec.getDuracion_recorrido()+" )";
		Conexion bd=null;
		Exception ex=null;
		PreparedStatement p=null;
		try {
			bd=Gestor_bbdd.get().getBD();
			p=bd.prepareStatement(SQL);
			p.executeUpdate();
		}
		catch (Exception e) {
			ex=e;
		}
		finally {
			bd.close();
			if (ex!=null)
				throw ex;
		}
	}

	public static void deleteTramo(int codigo, int codigo_linea) throws Exception {
		String SQL="Delete from tramo where codigo_tramo=? and codigo_linea=?";
		Conexion bd=null;
		Exception ex=null;
		PreparedStatement p=null;
		try {
			bd=Gestor_bbdd.get().getBD();
			p=bd.prepareStatement(SQL);
			p.setInt(1, codigo);
			p.setInt(2, codigo_linea);
			p.executeUpdate();
		}
		catch (Exception e) {
			ex=e;
		}
		finally {
			bd.close();
			if (ex!=null)
				throw ex;
		}	
	}
	
	
	public static Tramo consultTramo(int codigo, int codigo_linea) throws Exception {
		Tramo vec=null;		
		String SQL="Select * from tramo where codigo_tramo=? and codigo_linea=?";
		
		Conexion bd=null;
		Exception ex=null;
		PreparedStatement p=null;
		try {
			bd=Gestor_bbdd.get().getBD();
			p=bd.prepareStatement(SQL);
			p.setInt(1, codigo);
			p.setInt(2, codigo_linea);
			ResultSet r=p.executeQuery();
			while (r.next()) {
				vec=new Tramo();
				vec.setCodigo_tramo(r.getInt("codigo_tramo"));
				vec.setCodigo_linea(r.getInt("codigo_linea"));
				vec.setParada_origen(r.getString("parada_origen"));
				vec.setParada_destino(r.getString("parada_destino"));
				vec.setDuracion_recorrido(r.getInt("duracion_recorrido"));
			}			
		}
		catch (Exception e) {
			ex=e;
		}
		finally {
			bd.close();
			if (ex!=null)
				throw ex;
		}
		return vec;
	}
	
	public static boolean existsTramo(int codigo, int codigo_linea) throws Exception {
		boolean existe_tramo = false;	
		String SQL="Select * from tramo where codigo_tramo=? and codigo_linea=?";

		Conexion bd=null;
		Exception ex=null;
		PreparedStatement p=null;
		try {
			bd=Gestor_bbdd.get().getBD();
			p=bd.prepareStatement(SQL);
			p.setInt(1, codigo);
			p.setInt(2, codigo_linea);
			ResultSet r=p.executeQuery();
			while (r.next()) {
				existe_tramo = true;
			}			
		}
		catch (Exception e) {
			ex=e;
		}
		finally {
			bd.close();
			if (ex!=null)
				throw ex;
		}
		return existe_tramo;
	}
	
	//Te devuelve el numero de tramos que existen
			public static int consultNumTramos() throws Exception {
				int numero_tramos=0;		
				String SQL="Select COUNT(*) from tramo";
				
				Conexion bd=null;
				Exception ex=null;
				PreparedStatement p=null;
				try {
					bd=Gestor_bbdd.get().getBD();
					p=bd.prepareStatement(SQL);
					ResultSet r=p.executeQuery();
					while (r.next()) {
						numero_tramos=r.getInt("COUNT(*)");
					}			
				}
				catch (Exception e) {
					ex=e;
				}
				finally {
					bd.close();
					if (ex!=null)
						throw ex;
				}
				return numero_tramos;
			}
			
			public static int consultTramo(int codigo) throws Exception {
				int numero_tramos=0;		
				String SQL="Select COUNT(*) from tramo where codigo_linea="+codigo+"";
				
				Conexion bd=null;
				Exception ex=null;
				PreparedStatement p=null;
				try {
					bd=Gestor_bbdd.get().getBD();
					p=bd.prepareStatement(SQL);
					ResultSet r=p.executeQuery();
					while (r.next()) {
						numero_tramos=r.getInt("COUNT(*)");
					}			
				}
				catch (Exception e) {
					ex=e;
				}
				finally {
					bd.close();
					if (ex!=null)
						throw ex;
				}
				return numero_tramos;
			}
	
	
	
	public static void modificarTramo(Tramo vec, int cod_tramo, int cod_linea) throws Exception{
		
		String SQL="UPDATE tramo SET parada_origen='"+vec.getParada_origen()+"', duracion_recorrido "+vec.getDuracion_recorrido()+"Where codigo_tramo="+cod_tramo+" and codigo_linea="+cod_linea;
		Conexion bd=null;
		Exception ex=null;
		PreparedStatement update=null;
		try {
			bd=Gestor_bbdd.get().getBD();
			update=bd.prepareStatement(SQL);
			update.executeUpdate();			
		}
		catch (Exception e) {
			ex=e;
		}
		finally {
			bd.close();
			if (ex!=null)
				throw ex;
		}
	}
	
	public static Vector<Tramo> getTramos() throws Exception {
		Vector<Tramo> result=new Vector<Tramo>();
		String SQL="Select (codigo_tramo,codigo_linea) from tramo";
		Conexion bd=null;
		Exception ex=null;
		PreparedStatement p=null;
		try {
			bd=Gestor_bbdd.get().getBD();
			p=bd.prepareStatement(SQL);
			ResultSet r=p.executeQuery();
			while (r.next()) {
				Tramo c=new Tramo();
				c.setCodigo_tramo(r.getInt("codigo_tramo"));
				c.setCodigo_linea(r.getInt("codigo_linea"));
				result.add(c);
			}			
		}
		catch (Exception e) {
			ex=e;
		}
		finally {
			bd.close();
			if (ex!=null)
				throw ex;
		}
		return result;
	}

	public static Vector<Tramo> consultRecorrido(String origen, String destino,String tipo) throws Exception {
		Vector<Tramo> result=new Vector<Tramo>();
		String SQL="Select a.*, b.* from tramo a, tramo b, vehiculo v where a.parada_origen='"+origen+"'and b.parada_destino='"+destino+"' and a.codigo_linea=b.codigo_linea and v.Codigo_linea=a.codigo_linea and v.licencia_necesitada='"+tipo+"'";
		Conexion bd=null;
		Exception ex=null;
		PreparedStatement p=null;
		try {
			bd=Gestor_bbdd.get().getBD();
			p=bd.prepareStatement(SQL);
			ResultSet r=p.executeQuery();
			while (r.next()) {
				Tramo c=new Tramo();
				c.setCodigo_tramo(r.getInt("a.codigo_tramo"));
				c.setCodigo_linea(r.getInt("a.codigo_linea"));
				c.setDuracion_recorrido(r.getDouble("a.duracion_recorrido"));
				c.setParada_destino(r.getString("a.parada_origen"));
				c.setParada_destino(r.getString("a.parada_destino"));
				result.add(c);
				Tramo c2=new Tramo();
				c2.setCodigo_tramo(r.getInt("b.codigo_tramo"));
				c2.setCodigo_linea(r.getInt("b.codigo_linea"));
				c.setDuracion_recorrido(r.getDouble("b.duracion_recorrido"));
				c.setParada_destino(r.getString("b.parada_origen"));
				c.setParada_destino(r.getString("b.parada_destino"));
				result.add(c2);
			}
		}
		catch (Exception e) {
			ex=e;
		}
		finally {
			bd.close();
			if (ex!=null)
				throw ex;
		}
		
		return result;
	}

	public static void modificarTramoEstacion(String nombre_antiguo,String nombre_nuevo) throws Exception {
		String SQL="UPDATE tramo SET parada_origen='"+nombre_nuevo+"' Where parada_origen='"+nombre_antiguo+"'";
		String SQL1="UPDATE tramo SET parada_destino='"+nombre_nuevo+"' Where parada_destino='"+nombre_antiguo+"'";
		Conexion bd=null;
		Exception ex=null;
		PreparedStatement update=null;
		try {
			bd=Gestor_bbdd.get().getBD();
			update=bd.prepareStatement(SQL);
			update.executeUpdate();	
			update=bd.prepareStatement(SQL1);
			update.executeUpdate();
		}
		catch (Exception e) {
			ex=e;
		}
		finally {
			bd.close();
			if (ex!=null)
				throw ex;
		}
		
	}
	
	
	
}
